﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sispe.Entities;
using System.Data;
using System.Data.Objects;

namespace Sispe.Repository
{
    public class PersonaRepository : MasterRepository, IPersonaRepository
    {
        public List<PERSONA> GetAllFromPersona()
        {
            var query = from p in context.PERSONAs.Include("SEXO").Include("ESTADO_CIVIL")
                        select p;
            ObjectContext.Refresh(RefreshMode.StoreWins, query);
            return query.ToList();
        }

        public List<PERSONA> GetAllFromPersonaByDescripcion(string descripcion)
        {
            var query = from p in context.PERSONAs.Include("SEXO").Include("ESTADO_CIVIL")
                        select p;
            if (descripcion != null && descripcion != string.Empty && descripcion != "")
            {
                query = from p in context.PERSONAs
                        where p.Dni.Contains(descripcion) ||
                                   p.ApeMaterno.ToUpper().Contains(descripcion) ||
                                   p.ApePaterno.ToUpper().Contains(descripcion) ||
                                   p.Nombres.ToUpper().Contains(descripcion)
                        select p;
            }
            ObjectContext.Refresh(RefreshMode.StoreWins, query);
            return query.ToList();
        }

        public PERSONA GetFromPersonaById(int id)
        {
            var query = from p in context.PERSONAs.Include("SEXO").Include("ESTADO_CIVIL")
                        where p.IdPersona.Equals(id)
                        select p;
            ObjectContext.Refresh(RefreshMode.StoreWins, query);
            return query.SingleOrDefault();
        }

        public PERSONA GetFromPersonaByDni(string dni)
        {
            var query = from p in context.PERSONAs.Include("SEXO").Include("ESTADO_CIVIL").Include("TELEFONOS")
                        where p.Dni.Contains(dni)
                        select p;
            ObjectContext.Refresh(RefreshMode.StoreWins, query);
            return query.SingleOrDefault();
        }

        public void AddPersona(PERSONA persona)
        {
            persona.DERECHO_HABIENTE = null;
            persona.ESTADO_CIVIL = null;
            persona.SEXO = null;
            persona.POSTULANTEs = null;
            persona.REFERENCIAs = null;
            persona.TELEFONOS = null;
            persona.TRABAJADOR = null;

            context.PERSONAs.Add(persona);
            try
            {
                context.SaveChanges();
            }
            catch (System.Data.Entity.Validation.DbEntityValidationException e)
            {

                var outputLines = new List<string>();
                foreach (var eve in e.EntityValidationErrors)
                {
                    outputLines.Add(string.Format(
                        "{0}: Entity of type \"{1}\" in state \"{2}\" has the following validation errors:",
                        DateTime.Now, eve.Entry.Entity.GetType().Name, eve.Entry.State));
                    foreach (var ve in eve.ValidationErrors)
                    {
                        outputLines.Add(string.Format(
                            "- Property: \"{0}\", Error: \"{1}\"",
                            ve.PropertyName, ve.ErrorMessage));
                    }
                }
                if (System.IO.File.Exists(@"D:\errors.txt"))
                {
                    System.IO.File.Delete(@"D:\errors.txt");
                    System.IO.File.AppendAllLines(@"d:\errors.txt", outputLines);
                }
                else
                {
                    System.IO.File.AppendAllLines(@"d:\errors.txt", outputLines);
                }
                throw;
            }
        }

        public void UpdatePersona(PERSONA persona)
        {
            //context.PERSONAs.Attach(persona);
            persona.DERECHO_HABIENTE = null;
            context.Entry(persona.ESTADO_CIVIL).State = EntityState.Detached;
            context.Entry(persona.SEXO).State = EntityState.Detached;
            persona.POSTULANTEs = null;
            persona.REFERENCIAs = null;
            persona.TELEFONOS = null;
            //context.Entry(persona.TRABAJADOR).State = EntityState.Detached;

            context.Entry(persona).State = System.Data.EntityState.Modified;
            try
            {
                context.SaveChanges();
            }
            catch (System.Data.Entity.Validation.DbEntityValidationException e)
            {

                var outputLines = new List<string>();
                foreach (var eve in e.EntityValidationErrors)
                {
                    outputLines.Add(string.Format(
                        "{0}: Entity of type \"{1}\" in state \"{2}\" has the following validation errors:",
                        DateTime.Now, eve.Entry.Entity.GetType().Name, eve.Entry.State));
                    foreach (var ve in eve.ValidationErrors)
                    {
                        outputLines.Add(string.Format(
                            "- Property: \"{0}\", Error: \"{1}\"",
                            ve.PropertyName, ve.ErrorMessage));
                    }
                }
                if (System.IO.File.Exists(@"D:\errors.txt"))
                {
                    System.IO.File.Delete(@"D:\errors.txt");
                    System.IO.File.AppendAllLines(@"d:\errors.txt", outputLines);
                }
                else
                {
                    System.IO.File.AppendAllLines(@"d:\errors.txt", outputLines);
                }
                throw;
            }
        }

        //registrar persona-trabajador
        public void AddPersonaTrabajador(PERSONA personaTrabajador)
        {
            
            //guardando TELFEONO-LINEA TELEFONICA
            foreach (var item in personaTrabajador.TELEFONOS)
            {
                item.LINEA_TELEFONICA = null;
                item.Dni = personaTrabajador.IdPersona;
                context.Entry(item).State = EntityState.Added;
            }

            //registramos primero a la PERSONA
            personaTrabajador.DERECHO_HABIENTE = null;
            personaTrabajador.POSTULANTEs = null;
            personaTrabajador.REFERENCIAs = null;

            //guardando ESPECIALIDADES del TRABAJADOR
            foreach (var item in personaTrabajador.TRABAJADOR.TRABAJADOR_ESPECIALIDAD)
            {
                item.ESPECIALIDAD_TRABAJADOR = null;
                item.TrabajadorId = personaTrabajador.IdPersona;
                context.Entry(item).State = EntityState.Added;
            }

            //guardando PADRES del TRABAJADOR
            foreach (var item in personaTrabajador.TRABAJADOR.TRABAJADOR_PADRES)
            {
                //item.PADRE = null;
                item.TRABAJADOR = null;
                item.TrabajadorId = personaTrabajador.IdPersona;
                context.Entry(item.PADRE).State = EntityState.Unchanged;
                context.Entry(item).State = EntityState.Added;
            }

            //guardando CAPACITACIONES del trabajador
            foreach (var item in personaTrabajador.TRABAJADOR.TRABAJADOR_CAPACITACION)
            {
                //item.CAPACITACION = null;
                item.TRABAJADOR = null;
                item.TrabajadorId = personaTrabajador.IdPersona;
                context.Entry(item.CAPACITACION).State = EntityState.Unchanged;
                context.Entry(item).State = EntityState.Added;
            }

            //guardando CURRICULO del trabajador
            //personaTrabajador.TRABAJADOR.CURRICULO = null;
            if (personaTrabajador.TRABAJADOR.CURRICULO != null)
            {
                context.Entry(personaTrabajador.TRABAJADOR.CURRICULO).State = EntityState.Added;
            }

            context.Entry(personaTrabajador.TRABAJADOR.EXPEDIENTE).State = EntityState.Added;

            //registramos al ultimo TRABAJADOR   
            context.Entry(personaTrabajador.TRABAJADOR.BANCO).State = EntityState.Unchanged;
            //context.Entry(personaTrabajador.TRABAJADOR.CONTRATOS).State = EntityState.Detached;
            //context.Entry(personaTrabajador.TRABAJADOR.CURRICULOes).State = EntityState.Detached;
            context.Entry(personaTrabajador.TRABAJADOR.ESTUDIO.GRADO).State = EntityState.Unchanged;
            context.Entry(personaTrabajador.TRABAJADOR.ESTUDIO).State = EntityState.Unchanged;
            //personaTrabajador.TRABAJADOR.EXPEDIENTEs = null;
            //context.Entry(personaTrabajador.TRABAJADOR.HISTORIAL_CAMBIOS_TRABAJADOR).State = EntityState.Detached;
            //context.Entry(personaTrabajador.TRABAJADOR.HUELLAs).State = EntityState.Detached;
            context.Entry(personaTrabajador.TRABAJADOR.REFERENCIA.PERSONA).State = EntityState.Unchanged;
            context.Entry(personaTrabajador.TRABAJADOR.REFERENCIA).State = EntityState.Unchanged;
            context.Entry(personaTrabajador.TRABAJADOR.REGIMEN_PENSIONARIO).State = EntityState.Unchanged;
            context.Entry(personaTrabajador.TRABAJADOR.RURAL).State = EntityState.Unchanged;
            context.Entry(personaTrabajador.TRABAJADOR.SOCIO).State = EntityState.Unchanged;
            context.Entry(personaTrabajador.TRABAJADOR.UBICACION_TRABAJADOR).State = EntityState.Unchanged;
            context.Entry(personaTrabajador.TRABAJADOR.UBIGEO).State = EntityState.Unchanged;
            //context.Entry(personaTrabajador.TRABAJADOR.USUARIO).State = EntityState.Detached;
            if (personaTrabajador.IdPersona.Equals(0))
            {
                context.PERSONAs.Add(personaTrabajador);
            }
            else
            {
                var trabajador = new TRABAJADOR();
                trabajador = personaTrabajador.TRABAJADOR;
                trabajador.Id = personaTrabajador.IdPersona;
                trabajador.BANCO = null;
                trabajador.ESTUDIO.GRADO = null;
                trabajador.ESTUDIO = null;
                trabajador.PERSONA = null;
                trabajador.REFERENCIA = null;
                trabajador.REGIMEN_PENSIONARIO = null;
                trabajador.RURAL = null;
                trabajador.SOCIO = null;
                trabajador.UBICACION_TRABAJADOR = null;
                trabajador.UBIGEO = null;
                context.TRABAJADORs.Add(trabajador);
            }
            
            try
            {
                context.SaveChanges();
            }
            catch (System.Data.Entity.Validation.DbEntityValidationException e)
            {

                var outputLines = new List<string>();
                foreach (var eve in e.EntityValidationErrors)
                {
                    outputLines.Add(string.Format(
                        "{0}: Entity of type \"{1}\" in state \"{2}\" has the following validation errors:",
                        DateTime.Now, eve.Entry.Entity.GetType().Name, eve.Entry.State));
                    foreach (var ve in eve.ValidationErrors)
                    {
                        outputLines.Add(string.Format(
                            "- Property: \"{0}\", Error: \"{1}\"",
                            ve.PropertyName, ve.ErrorMessage));
                    }
                }
                if (System.IO.File.Exists(@"D:\errors.txt"))
                {
                    System.IO.File.Delete(@"D:\errors.txt");
                    System.IO.File.AppendAllLines(@"d:\errors.txt", outputLines);
                }
                else
                {
                    System.IO.File.AppendAllLines(@"d:\errors.txt", outputLines);
                }
                throw;
            }
        }

        //editar persona-trabajador
        public void UpdatePersonaTrabajador(PERSONA personaTrabajador)
        {
            var trabajador = context.TRABAJADORs.Find(personaTrabajador.IdPersona);
            var personaDB = context.PERSONAs.Find(personaTrabajador.IdPersona);

            personaDB.TRABAJADOR = trabajador;
            
            personaDB.ApeMaterno = personaTrabajador.ApeMaterno;
            personaDB.ApePaterno = personaTrabajador.ApePaterno;
            personaDB.Direccion = personaTrabajador.Direccion;
            personaDB.Dni = personaTrabajador.Dni;
            personaDB.Email = personaTrabajador.Email;
            personaDB.FechaNacimiento = personaTrabajador.FechaNacimiento;
            personaDB.IdEstadoCivil = personaTrabajador.IdEstadoCivil;
            personaDB.IdSexo = personaTrabajador.IdSexo;
            personaDB.Nombres = personaTrabajador.Nombres;
            personaDB.TRABAJADOR.CondicionDomicilio = personaTrabajador.TRABAJADOR.CondicionDomicilio;
            //personaDB.TRABAJADOR.FechaIngreso = personaTrabajador.TRABAJADOR.FechaIngreso;
            personaDB.TRABAJADOR.Talla = personaTrabajador.TRABAJADOR.Talla.ToUpper();//
            personaDB.TRABAJADOR.AutogeneradoEsSalud = personaTrabajador.TRABAJADOR.AutogeneradoEsSalud.ToUpper();//
            personaDB.TRABAJADOR.GrupoSanguineo = personaTrabajador.TRABAJADOR.GrupoSanguineo.ToUpper();
            personaDB.TRABAJADOR.IdBanco = personaTrabajador.TRABAJADOR.IdBanco;
            personaDB.TRABAJADOR.IdEstudios = personaTrabajador.TRABAJADOR.IdEstudios;
            personaDB.TRABAJADOR.IdReferencia = personaTrabajador.TRABAJADOR.IdReferencia;
            personaDB.TRABAJADOR.IdRegimenPensionario = personaTrabajador.TRABAJADOR.IdRegimenPensionario;
            personaDB.TRABAJADOR.IdRural = personaTrabajador.TRABAJADOR.IdRural;
            personaDB.TRABAJADOR.IdSocio = personaTrabajador.TRABAJADOR.IdSocio;
            personaDB.TRABAJADOR.IdUbicacionTrabajador = personaTrabajador.TRABAJADOR.IdUbicacionTrabajador;
            personaDB.TRABAJADOR.IdUbigeo = personaTrabajador.TRABAJADOR.IdUbigeo;
            personaDB.TRABAJADOR.Nacionalidad = personaTrabajador.TRABAJADOR.Nacionalidad;
            personaDB.TRABAJADOR.NroConstanciaEstudios = personaTrabajador.TRABAJADOR.NroConstanciaEstudios;
            personaDB.TRABAJADOR.NroCuenta = personaTrabajador.TRABAJADOR.NroCuenta;
            personaDB.TRABAJADOR.NroCusp = personaTrabajador.TRABAJADOR.NroCusp.ToUpper();
            personaDB.TRABAJADOR.Edad = personaTrabajador.TRABAJADOR.Edad;
            personaDB.TRABAJADOR.Observacion = personaTrabajador.TRABAJADOR.Observacion;
            personaDB.TRABAJADOR.PaisEmisor = personaTrabajador.TRABAJADOR.PaisEmisor;
            personaDB.TRABAJADOR.Recomendable = personaTrabajador.TRABAJADOR.Recomendable;
            personaDB.TRABAJADOR.Sindicato = personaTrabajador.TRABAJADOR.Sindicato;
            personaDB.TRABAJADOR.Zapato = personaTrabajador.TRABAJADOR.Zapato;
            personaDB.ESTADO_CIVIL = personaTrabajador.ESTADO_CIVIL;
            personaDB.SEXO = personaTrabajador.SEXO;
            personaDB.TRABAJADOR.BANCO = personaTrabajador.TRABAJADOR.BANCO;
            personaDB.TRABAJADOR.ESTUDIO = personaTrabajador.TRABAJADOR.ESTUDIO;
            personaDB.TRABAJADOR.REFERENCIA = personaTrabajador.TRABAJADOR.REFERENCIA;
            personaDB.TRABAJADOR.REGIMEN_PENSIONARIO = personaTrabajador.TRABAJADOR.REGIMEN_PENSIONARIO;
            personaDB.TRABAJADOR.RURAL = personaTrabajador.TRABAJADOR.RURAL;
            personaDB.TRABAJADOR.SOCIO = personaTrabajador.TRABAJADOR.SOCIO;
            personaDB.TRABAJADOR.UBICACION_TRABAJADOR = personaTrabajador.TRABAJADOR.UBICACION_TRABAJADOR;
            personaDB.TRABAJADOR.UBIGEO = personaTrabajador.TRABAJADOR.UBIGEO;
            personaDB.TRABAJADOR.FOTOes = personaTrabajador.TRABAJADOR.FOTOes;
            personaDB.TRABAJADOR.EXPEDIENTE = personaTrabajador.TRABAJADOR.EXPEDIENTE;
            personaDB.TRABAJADOR.CURRICULO = personaTrabajador.TRABAJADOR.CURRICULO;
            personaDB.TRABAJADOR.Hijos = personaTrabajador.TRABAJADOR.Hijos;
            personaDB.TRABAJADOR.NivelEstudios = personaTrabajador.TRABAJADOR.NivelEstudios;
            personaDB.TRABAJADOR.ComentarioNivel = personaTrabajador.TRABAJADOR.ComentarioNivel;

            personaTrabajador.TRABAJADOR.IdEstudios = 1;

            foreach (var item in personaTrabajador.TELEFONOS)
            {
                item.LINEA_TELEFONICA = null;
                if (item.Id.Equals(0))
                {
                    //item.LINEA_TELEFONICA = null;
                    item.PERSONAs = personaDB;
                    //item.PERSONAs = null;
                    item.LINEA_TELEFONICA = context.LINEA_TELEFONICA.Find(item.IdLineaTelefonica);
                    context.Entry(item).State = EntityState.Added;
                    personaDB.TELEFONOS.Add(item);
                }
                else
                {
                    context.TELEFONOes.Attach(item);
                    context.Entry(item).State = System.Data.EntityState.Modified;
                }
            }

            foreach (var item in personaTrabajador.TRABAJADOR.FOTOCHECKS)
            {
                if (item.Id.Equals(0))
                {
                    item.TRABAJADOR = null;
                    item.Dni = personaTrabajador.TRABAJADOR.Id;
                    context.Entry(item).State = EntityState.Added;
                    personaDB.TRABAJADOR.FOTOCHECKS.Add(item);

                }
                else
                {
                    context.FOTOCHECK.Attach(item);
                    context.Entry(item).State = EntityState.Modified;
                }
            }

            foreach (var item in personaTrabajador.TRABAJADOR.TRABAJADOR_ESPECIALIDAD)
            {
                item.ESPECIALIDAD_TRABAJADOR = null;
                if (item.Id.Equals(0))
                {
                    item.TRABAJADOR = null;
                    item.ESPECIALIDAD_TRABAJADOR = null;
                    item.TrabajadorId = personaTrabajador.TRABAJADOR.Id;
                    context.Entry(item).State = EntityState.Added;
                    personaDB.TRABAJADOR.TRABAJADOR_ESPECIALIDAD.Add(item);
                }
                else
                {
                    context.TRABAJADOR_ESPECIALIDAD.Attach(item);
                    context.Entry(item).State = EntityState.Modified;
                }
            }

            foreach (var item in personaTrabajador.TRABAJADOR.TRABAJADOR_PADRES)
            {
                item.PADRE = null;
                if (item.Id.Equals(0))
                {
                    item.PADRE = null;
                    item.TRABAJADOR = null;
                    item.TrabajadorId = personaTrabajador.TRABAJADOR.Id;
                    context.Entry(item).State = EntityState.Added;
                    personaDB.TRABAJADOR.TRABAJADOR_PADRES.Add(item);
                }
                else
                {
                    item.PADRE = null;
                    item.TRABAJADOR = null;
                    context.TRABAJADOR_PADRES.Attach(item);
                    context.Entry(item).State = EntityState.Modified;
                }
            }
            
            //guardando CAPACITACIONES del trabajador
            foreach (var item in personaTrabajador.TRABAJADOR.TRABAJADOR_CAPACITACION)
            {
                item.CAPACITACION = null;
                if (item.Id.Equals(0))
                {
                    item.CAPACITACION = null;
                    item.TRABAJADOR = null;
                    item.TrabajadorId = personaTrabajador.TRABAJADOR.Id;
                    context.Entry(item).State = EntityState.Added;
                    personaDB.TRABAJADOR.TRABAJADOR_CAPACITACION.Add(item);
                }
                else
                {
                    item.CAPACITACION = null;
                    item.TRABAJADOR = null;
                    context.TRABAJADOR_CAPACITACION.Attach(item);
                    context.Entry(item).State = EntityState.Modified;
                }
            }
            personaDB.TRABAJADOR.AutogeneradoEsSalud.ToUpper();
            personaDB.TRABAJADOR.Talla.ToUpper();
            personaDB.TRABAJADOR.NroCusp.ToUpper();
            context.Entry(personaDB.TRABAJADOR.FOTOes).State = EntityState.Modified;
            context.Entry(personaDB.TRABAJADOR).State = EntityState.Modified;
            context.Entry(personaDB.TRABAJADOR.EXPEDIENTE).State = EntityState.Modified;
            if (personaDB.TRABAJADOR.CURRICULO != null)
            {
                context.Entry(personaDB.TRABAJADOR.CURRICULO).State = EntityState.Modified;
            }
            context.Entry(personaDB).State = EntityState.Modified;
            try
            {
                context.SaveChanges();
            }
            catch (System.Data.Entity.Validation.DbEntityValidationException e)
            {

                var outputLines = new List<string>();
                foreach (var eve in e.EntityValidationErrors)
                {
                    outputLines.Add(string.Format(
                        "{0}: Entity of type \"{1}\" in state \"{2}\" has the following validation errors:",
                        DateTime.Now, eve.Entry.Entity.GetType().Name, eve.Entry.State));
                    foreach (var ve in eve.ValidationErrors)
                    {
                        outputLines.Add(string.Format(
                            "- Property: \"{0}\", Error: \"{1}\"",
                            ve.PropertyName, ve.ErrorMessage));
                    }
                }
                if (System.IO.File.Exists(@"D:\errors.txt"))
                {
                    System.IO.File.Delete(@"D:\errors.txt");
                    System.IO.File.AppendAllLines(@"d:\errors.txt", outputLines);
                }
                else
                {
                    System.IO.File.AppendAllLines(@"d:\errors.txt", outputLines);
                }
                throw;
            }
        }

        public void AddPersonaPostulante(PERSONA personaPostulante)
        {
            //guardando TELFEONO-LINEA TELEFONICA
            foreach (var item in personaPostulante.TELEFONOS)
            {
                item.LINEA_TELEFONICA = null;
                context.Entry(item).State = EntityState.Added;
            }


            personaPostulante.DERECHO_HABIENTE = null;

            personaPostulante.REFERENCIAs = null;


            context.PERSONAs.Add(personaPostulante);

            try
            {
                context.SaveChanges();
            }
            catch (System.Data.Entity.Validation.DbEntityValidationException e)
            {

                var outputLines = new List<string>();
                foreach (var eve in e.EntityValidationErrors)
                {
                    outputLines.Add(string.Format(
                        "{0}: Entity of type \"{1}\" in state \"{2}\" has the following validation errors:",
                        DateTime.Now, eve.Entry.Entity.GetType().Name, eve.Entry.State));
                    foreach (var ve in eve.ValidationErrors)
                    {
                        outputLines.Add(string.Format(
                            "- Property: \"{0}\", Error: \"{1}\"",
                            ve.PropertyName, ve.ErrorMessage));
                    }
                }
                if (System.IO.File.Exists(@"D:\errors.txt"))
                {
                    System.IO.File.Delete(@"D:\errors.txt");
                    System.IO.File.AppendAllLines(@"d:\errors.txt", outputLines);
                }
                else
                {
                    System.IO.File.AppendAllLines(@"d:\errors.txt", outputLines);
                }
                throw;
            }
        }

        public void UpdatePersonaPostulante(PERSONA personaPostulante)
        {
            var postulante = context.POSTULANTEs.Find(personaPostulante.IdPersona);
            var personaDB = context.PERSONAs.Find(personaPostulante.IdPersona);

            personaDB.POSTULANTEs = postulante;

            personaDB.ApeMaterno = personaPostulante.ApeMaterno;
            personaDB.ApePaterno = personaPostulante.ApePaterno;
            personaDB.Direccion = personaPostulante.Direccion;
            personaDB.Dni = personaPostulante.Dni;
            personaDB.Email = personaPostulante.Email;
            personaDB.FechaNacimiento = personaPostulante.FechaNacimiento;
            personaDB.IdEstadoCivil = personaPostulante.IdEstadoCivil;
            personaDB.IdSexo = personaPostulante.IdSexo;
            personaDB.Nombres = personaPostulante.Nombres;

            personaDB.ESTADO_CIVIL = personaPostulante.ESTADO_CIVIL;
            personaDB.SEXO = personaPostulante.SEXO;

            personaDB.POSTULANTEs.Disponibilidad = personaPostulante.POSTULANTEs.Disponibilidad;
            personaDB.POSTULANTEs.Observacion = personaPostulante.POSTULANTEs.Observacion;

            foreach (var item in personaPostulante.TELEFONOS)
            {
                item.LINEA_TELEFONICA = null;
                if (item.Id.Equals(0))
                {
                    item.PERSONAs = personaDB;
                    item.LINEA_TELEFONICA = context.LINEA_TELEFONICA.Find(item.IdLineaTelefonica);
                    context.Entry(item).State = EntityState.Added;
                    personaDB.TELEFONOS.Add(item);
                }
                else
                {
                    context.TELEFONOes.Attach(item);
                    context.Entry(item).State = System.Data.EntityState.Modified;
                }
            }

            context.Entry(personaDB).State = EntityState.Modified;
            try
            {
                context.SaveChanges();
            }
            catch (System.Data.Entity.Validation.DbEntityValidationException e)
            {

                var outputLines = new List<string>();
                foreach (var eve in e.EntityValidationErrors)
                {
                    outputLines.Add(string.Format(
                        "{0}: Entity of type \"{1}\" in state \"{2}\" has the following validation errors:",
                        DateTime.Now, eve.Entry.Entity.GetType().Name, eve.Entry.State));
                    foreach (var ve in eve.ValidationErrors)
                    {
                        outputLines.Add(string.Format(
                            "- Property: \"{0}\", Error: \"{1}\"",
                            ve.PropertyName, ve.ErrorMessage));
                    }
                }
                if (System.IO.File.Exists(@"D:\errors.txt"))
                {
                    System.IO.File.Delete(@"D:\errors.txt");
                    System.IO.File.AppendAllLines(@"d:\errors.txt", outputLines);
                }
                else
                {
                    System.IO.File.AppendAllLines(@"d:\errors.txt", outputLines);
                }
                throw;
            }
        }


        public List<PERSONA> GetAllFromOnlyPersona()
        {
            var query = from p in context.PERSONAs.Include("SEXO").Include("ESTADO_CIVIL").Include("DERECHO_HABIENTE")
                        //where p.TRABAJADOR == null && p.DERECHO_HABIENTE.Count == 0
                        select p;
            //ObjectContext.Refresh(RefreshMode.StoreWins, query);
            return query.ToList();
        }


        public PERSONA GetFromOnlyPersonaByDni(string dni)
        {
            var query = from p in context.PERSONAs.Include("SEXO").Include("ESTADO_CIVIL").Include("DERECHO_HABIENTE")
                        where p.Dni.Contains(dni) //&& p.TRABAJADOR == null && p.DERECHO_HABIENTE.Count == 0
                        select p;
            ObjectContext.Refresh(RefreshMode.StoreWins, query);
            return query.SingleOrDefault();
        }

        public bool ExistImageHash(string hash, int id)
        {
            var query = from p in context.PERSONAs.Include("CURRICULO")
                        where p.TRABAJADOR.CURRICULO.Hash.ToUpper().CompareTo(hash.ToUpper()) == 0 && p.TRABAJADOR.Id != id
                        select p;

            return query.Any();
        }
    }
}
